﻿#pragma once
#ifndef BinaryDispatch_hpp
#define BinaryDispatch_hpp

#include<functional>
#include<unordered_map>
#include<string>
#include"../Concurrency/SpinLock.hpp"
#include"NetworkDef.hpp"
#include"DispatchInterface.hpp"
#include"../Malloc/MemoryPool.hpp"

namespace MMFNetwork{

    //二进制协议流回调函数
    using BinMsgCallback = std::function<void(const std::shared_ptr<Session>& session, MMFMessageHeader* pkg)>;

    class BinaryDispatch: public DispatchInterface
    {

        //内存池
        MMFAlloc::MemoryPool mMemPool;

        //消息与回调函数的映射
        //这里使用string_view时因为想减少从buffer到std::string的产生临时量内存申请
        std::unordered_map<std::string_view, BinMsgCallback> mMsgCallback;

        //互斥锁
        MMF::SpinLock mLock;

        //当消息未注册时调用的默认处理
        BinMsgCallback mDefaultCallback;

    public:

        BinaryDispatch(const BinMsgCallback& defaultCallback);

        ~BinaryDispatch();

        //处理消息的函数
        //此消息应该在server上层类中被调用
        void HandleMessage(const std::shared_ptr<Session>& session, void* pkg, size_t size) override;

        //注册消息回调
        //函数名请使用，字面值，或者时长生命周期的值
        bool RegisterCallback(const char* msgName, BinMsgCallback callback);

        //反注册消息回调
        //函数名请使用，字面值，或者时长生命周期的值
        bool UnregisterCallback(const char* msgName);
    };

}


#endif